# Charger les données depuis les fichiers CSV
df_siret <- read_csv2("data/siret.csv")
df_datagouv <- read_csv2("data/datagouv.csv")
# Fusionner les données sur l'identifiant 'siret'
result <- left_join(df_siret, df_datagouv, by = "siret")
# Corriger les codes postaux et codes insee
format_code <- function(code) {
ifelse(!is.na(suppressWarnings(as.numeric(code))), sprintf("%05d", as.integer(code)), code)
}
result$`Code postal de l'établissement` <- sapply(result$`Code postal de l'établissement`, format_code)
result$`Code commune de l'établissement` <- sapply(result$`Code commune de l'établissement`, format_code)
# Filtrer les données pour garder seulement 'Commune et commune nouvelle'
filtered_result <- result %>%
filter(`Nature juridique de l'unité légale` == "Commune et commune nouvelle")
# Séparer les communes non doublonées (une seule occurence de code insee)
communes_simples <- filtered_result %>%
group_by(`Code commune de l'établissement`) %>%
filter(n() == 1) %>%
ungroup()
# Filtrer les communes en doublons en ne gardant que celles qui publient sur data.gouv.fr (metric.dataset >= 1)
communes_multiples_cleaned <- filtered_result %>%
group_by(`Code commune de l'établissement`) %>%
filter(n() > 1 & metric.datasets >= 1) %>%
ungroup()
# Réintégration des communes non doublonées
result_final <- bind_rows(communes_simples, communes_multiples_cleaned)
# Sauvegarder le résultat dans un nouveau fichier CSV
write_csv(result_final, "data/enriched_siret.csv")
# Affichage du nombre de lignes après nettoyage
print(paste("Nombre de lignes après nettoyage :", nrow(result_final)))
## [1] "Nombre de lignes après nettoyage : 33012"
# Ajout des données population communale
donnees_communes <- read_csv2("data/donnees_communes.csv") %>%
select(COM, PTOT)
communes <- left_join(result_final, donnees_communes, by = c("Code commune de l'établissement" = "COM"))
communes <- communes %>%
rename(code_epci = `Code EPCI de l'établissement`)
# Sauvegarde du CSV
write_csv(communes, "data/communes.csv")
library(readr)
library(ggplot2)
library(dplyr)
# Charger le fichier de données
data <- read_csv("data/communes+siret+metrics+pop.csv")
# Nettoyage
data <- data %>%
rename(
unite_legale = `Dénomination de l'unité légale`,
PTOT = PTOT,
metric.datasets = metric.datasets
)
# 50 communes les plus peuplées
top_50_communes <- data %>%
arrange(desc(PTOT)) %>%
slice_head(n = 50)
# Visualisation
ggplot(top_50_communes, aes(x = reorder(unite_legale, PTOT), y = metric.datasets)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
theme_minimal() +
labs(
title = "Nombre de datasets des 50 communes les plus peuplées",
x = "Commune",
y = "datasets"
) +
theme(
axis.text.y = element_text(size = 4),
plot.title = element_text(hjust = 0.5)
)
## EPCI
library(dplyr)
# Filtrer les données EPCI et supprimer les doublons
epci <- result %>%
filter(`Nature juridique de l'unité légale` %in% c(
"Communauté de communes",
"Communauté d'agglomération",
"Métropole",
"Communauté urbaine"
)) %>%
rename(code_epci = `Code EPCI de l'établissement`) %>%
distinct(code_epci, .keep_all = TRUE) %>%
mutate(code_epci = trimws(as.character(code_epci)))
# Traitement et nettoyage
communes <- communes %>%
mutate(code_epci = as.character(code_epci))
epci <- epci %>%
mutate(code_epci = as.character(code_epci))
communes <- communes %>%
mutate(code_epci = trimws(code_epci))
epci <- epci %>%
mutate(code_epci = trimws(code_epci))
communes <- communes %>%
filter(!is.na(code_epci))
# Joindre les tables EPCI et communes
communes_epci <- communes %>%
left_join(
epci %>% select(code_epci, metric.datasets, metric.datasets.epci = metric.datasets),
by = "code_epci"
)
# Ajouter les informations EPCI
communes_epci <- communes_epci %>%
mutate(
epci_present = ifelse(!is.na(metric.datasets) & metric.datasets > 0, "oui", "non"),
epci_datasets = ifelse(epci_present == "oui", metric.datasets, NA)
) %>%
select(-metric.datasets)
write_csv(communes_epci, "data/communes_epci_brut.csv")
# Charger les données de géolocalisation
geoloc_data <- read_csv2("data/geoloc.csv", show_col_types = FALSE)
# Une fois que tu as vérifié, renomme la colonne "SIRET" si elle existe
geoloc_data <- geoloc_data %>%
rename(siret = `SIRET du siège de l'unité légale`)
geoloc_data <- geoloc_data %>%
distinct(siret, .keep_all = TRUE) # Conserve uniquement la première occurrence pour chaque siret
# Joindre les données de géolocalisation avec communes_epci en utilisant le "siret" comme clé de jointure
communes_epci_geoloc <- communes_epci %>%
left_join(geoloc_data %>% select(siret, `Géolocalisation de l'établissement`), by = "siret")
# Sauvegarder le CSV final avec la géolocalisation ajoutée
write_csv(communes_epci_geoloc, "data/communes_epci_geoloc.csv")
# Librairies
library(dplyr)
library(ggplot2)
library(ggrepel)
library(scales)
library(plotly)
# Chargement et traitement des données
data <- read.csv("data/00-communes.csv")
data_clean <- data %>%
filter(!is.na(region))
region_summary <- data_clean %>%
group_by(region) %>%
summarise(
total_communes = n(),
communes_with_datasets = sum(!is.na(datsets_commune) & datsets_commune >= 1, na.rm = TRUE)
) %>%
mutate(percentage_with_datasets = (communes_with_datasets / total_communes) * 100) %>%
arrange(desc(percentage_with_datasets))
# Histogramme
ggplot(region_summary, aes(x = reorder(region, percentage_with_datasets), y = percentage_with_datasets)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(
title = "Part des communes publiant au moins un jeu de données",
x = "Région",
y = "% des communes"
) +
theme_minimal()
# Tableau
region_summary %>%
arrange(desc(percentage_with_datasets)) %>%
knitr::kable(col.names = c("Région", "Total Communes", "Communes avec jeux de données", "Pourcentage (%)"))
| Région | Total Communes | Communes avec jeux de données | Pourcentage (%) |
|---|---|---|---|
| La Réunion | 19 | 3 | 15.7894737 |
| Provence-Alpes-Côte d’Azur | 886 | 53 | 5.9819413 |
| Martinique | 34 | 2 | 5.8823529 |
| Guyane | 19 | 1 | 5.2631579 |
| Île-de-France | 1186 | 59 | 4.9747049 |
| Guadeloupe | 27 | 1 | 3.7037037 |
| Pays de la Loire | 1060 | 35 | 3.3018868 |
| Bretagne | 1086 | 30 | 2.7624309 |
| Auvergne-Rhône-Alpes | 3789 | 55 | 1.4515703 |
| Nouvelle-Aquitaine | 4067 | 49 | 1.2048193 |
| Centre-Val de Loire | 1667 | 17 | 1.0197960 |
| Hauts-de-France | 3650 | 32 | 0.8767123 |
| Corse | 355 | 3 | 0.8450704 |
| Normandie | 2411 | 16 | 0.6636251 |
| Bourgogne-Franche-Comté | 3529 | 20 | 0.5667328 |
| Occitanie | 4301 | 21 | 0.4882585 |
| Grand Est | 4807 | 21 | 0.4368629 |
| 2 | 0 | 0.0000000 | |
| Mayotte | 17 | 0 | 0.0000000 |
# Traitement des données pour obtenir le nombre total de jeux de données par région
region_summary_datasets <- data %>%
filter(!is.na(region)) %>%
group_by(region) %>%
summarise(
total_datasets = sum(datsets_commune, na.rm = TRUE)
) %>%
arrange(desc(total_datasets))
# Créer l'histogramme basé sur le nombre total de jeux de données par région
ggplot(region_summary_datasets, aes(x = reorder(region, total_datasets), y = total_datasets)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
labs(
title = "Total des jeux de données par région",
x = "Région",
y = "Nombre total de jeux de données"
) +
theme_minimal()
# Population ajoutée
region_summary_ptot <- data %>%
filter(!is.na(region) & !is.na(ptot)) %>%
group_by(region) %>%
summarise(
total_population = sum(ptot, na.rm = TRUE),
population_with_datasets = sum(ptot[datsets_commune >= 1], na.rm = TRUE),
total_datasets = sum(datsets_commune, na.rm = TRUE)
) %>%
mutate(population_coverage_ratio = population_with_datasets / total_population)
p <- ggplot(region_summary_ptot, aes(x = total_population, y = total_datasets, text = region, color = population_coverage_ratio)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
scale_color_gradient(low = "lightblue", high = "darkblue", name = "Population couverte (%)") +
labs(
title = "Relation entre la population et le nombre total de jeux de données par région",
x = "Population totale (en millions)",
y = "Nombre total de jeux de données"
) +
theme_minimal()
interactive_plot <- ggplotly(p, tooltip = c("text", "population_coverage_ratio"))
interactive_plot
# Librairies
library(dplyr)
library(ggplot2)
library(ggrepel)
library(scales)
library(plotly)
# Chargement et traitement des données
data <- read.csv("data/00-communes.csv")
data_clean <- data %>%
filter(!is.na(departement))
departement_summary <- data_clean %>%
group_by(departement) %>%
summarise(
total_communes = n(),
communes_with_datasets = sum(!is.na(datsets_commune) & datsets_commune >= 1, na.rm = TRUE)
) %>%
mutate(percentage_with_datasets = (communes_with_datasets / total_communes) * 100) %>%
arrange(desc(percentage_with_datasets))
# Tableau
departement_summary %>%
arrange(desc(percentage_with_datasets)) %>%
knitr::kable(col.names = c("Département", "Total Communes", "Communes avec jeux de données", "Pourcentage (%)"))
| Département | Total Communes | Communes avec jeux de données | Pourcentage (%) |
|---|---|---|---|
| Hauts-de-Seine | 35 | 15 | 42.8571429 |
| 3 | 1 | 33.3333333 | |
| Seine-Saint-Denis | 35 | 6 | 17.1428571 |
| La Réunion | 19 | 3 | 15.7894737 |
| Hautes-Alpes | 145 | 21 | 14.4827586 |
| Val-de-Marne | 39 | 5 | 12.8205128 |
| Maine-et-Loire | 140 | 12 | 8.5714286 |
| Var | 134 | 10 | 7.4626866 |
| Bouches-du-Rhône | 110 | 7 | 6.3636364 |
| Martinique | 34 | 2 | 5.8823529 |
| Vendée | 205 | 12 | 5.8536585 |
| Guyane | 19 | 1 | 5.2631579 |
| Alpes-Maritimes | 157 | 8 | 5.0955414 |
| Ille-et-Vilaine | 294 | 14 | 4.7619048 |
| Morbihan | 225 | 9 | 4.0000000 |
| Isère | 478 | 19 | 3.9748954 |
| Loire-Atlantique | 179 | 7 | 3.9106145 |
| Guadeloupe | 27 | 1 | 3.7037037 |
| Val-d’Oise | 171 | 6 | 3.5087719 |
| Rhône | 247 | 8 | 3.2388664 |
| Yvelines | 247 | 8 | 3.2388664 |
| Charente-Maritime | 438 | 14 | 3.1963470 |
| Nord | 612 | 18 | 2.9411765 |
| Essonne | 180 | 5 | 2.7777778 |
| Vaucluse | 147 | 4 | 2.7210884 |
| Seine-et-Marne | 478 | 13 | 2.7196653 |
| Corse-du-Sud | 122 | 3 | 2.4590164 |
| Vienne | 252 | 6 | 2.3809524 |
| Haute-Savoie | 263 | 6 | 2.2813688 |
| Ain | 363 | 8 | 2.2038567 |
| Indre | 233 | 5 | 2.1459227 |
| Savoie | 250 | 5 | 2.0000000 |
| Hérault | 326 | 6 | 1.8404908 |
| Finistère | 247 | 4 | 1.6194332 |
| Gironde | 508 | 8 | 1.5748031 |
| Alpes-de-Haute-Provence | 193 | 3 | 1.5544041 |
| Deux-Sèvres | 219 | 3 | 1.3698630 |
| Landes | 315 | 4 | 1.2698413 |
| Oise | 650 | 8 | 1.2307692 |
| Loir-et-Cher | 251 | 3 | 1.1952191 |
| Seine-Maritime | 678 | 8 | 1.1799410 |
| Indre-et-Loire | 258 | 3 | 1.1627907 |
| Aveyron | 271 | 3 | 1.1070111 |
| Haute-Vienne | 186 | 2 | 1.0752688 |
| Vosges | 487 | 5 | 1.0266940 |
| Loire | 308 | 3 | 0.9740260 |
| Lot-et-Garonne | 308 | 3 | 0.9740260 |
| Doubs | 516 | 5 | 0.9689922 |
| Côtes-d’Armor | 320 | 3 | 0.9375000 |
| Sarthe | 324 | 3 | 0.9259259 |
| Côte-d’Or | 676 | 6 | 0.8875740 |
| Manche | 380 | 3 | 0.7894737 |
| Pyrénées-Atlantiques | 528 | 4 | 0.7575758 |
| Haute-Marne | 406 | 3 | 0.7389163 |
| Cher | 272 | 2 | 0.7352941 |
| Meurthe-et-Moselle | 559 | 4 | 0.7155635 |
| Haute-Garonne | 572 | 4 | 0.6993007 |
| Nièvre | 303 | 2 | 0.6600660 |
| Dordogne | 466 | 3 | 0.6437768 |
| Loiret | 314 | 2 | 0.6369427 |
| Bas-Rhin | 473 | 3 | 0.6342495 |
| Ardèche | 316 | 2 | 0.6329114 |
| Haut-Rhin | 321 | 2 | 0.6230530 |
| Charente | 331 | 2 | 0.6042296 |
| Gard | 336 | 2 | 0.5952381 |
| Eure-et-Loir | 339 | 2 | 0.5899705 |
| Drôme | 345 | 2 | 0.5797101 |
| Eure | 538 | 3 | 0.5576208 |
| Saône-et-Loire | 548 | 3 | 0.5474453 |
| Mayenne | 212 | 1 | 0.4716981 |
| Aude | 425 | 2 | 0.4705882 |
| Gers | 453 | 2 | 0.4415011 |
| Calvados | 464 | 2 | 0.4310345 |
| Meuse | 486 | 2 | 0.4115226 |
| Aisne | 779 | 3 | 0.3851091 |
| Haute-Saône | 529 | 2 | 0.3780718 |
| Pas-de-Calais | 856 | 3 | 0.3504673 |
| Tarn | 305 | 1 | 0.3278689 |
| Allier | 308 | 1 | 0.3246753 |
| Ariège | 317 | 1 | 0.3154574 |
| Moselle | 666 | 2 | 0.3003003 |
| Yonne | 406 | 1 | 0.2463054 |
| Puy-de-Dôme | 440 | 1 | 0.2272727 |
| Jura | 455 | 1 | 0.2197802 |
| Ardennes | 429 | 0 | 0.0000000 |
| Aube | 410 | 0 | 0.0000000 |
| Cantal | 236 | 0 | 0.0000000 |
| Corrèze | 267 | 0 | 0.0000000 |
| Creuse | 249 | 0 | 0.0000000 |
| Haute-Corse | 233 | 0 | 0.0000000 |
| Haute-Loire | 235 | 0 | 0.0000000 |
| Hautes-Pyrénées | 458 | 0 | 0.0000000 |
| Lot | 297 | 0 | 0.0000000 |
| Lozère | 133 | 0 | 0.0000000 |
| Marne | 570 | 0 | 0.0000000 |
| Mayotte | 17 | 0 | 0.0000000 |
| Orne | 351 | 0 | 0.0000000 |
| Pyrénées-Orientales | 216 | 0 | 0.0000000 |
| Somme | 753 | 0 | 0.0000000 |
| Tarn-et-Garonne | 192 | 0 | 0.0000000 |
| Territoire de Belfort | 96 | 0 | 0.0000000 |
# Nombre total de jeux de données par département
departement_summary_datasets <- data %>%
filter(!is.na(departement)) %>%
group_by(departement) %>%
summarise(
total_datasets = sum(datsets_commune, na.rm = TRUE)
) %>%
arrange(desc(total_datasets))
# Traitement des données pour obtenir le nombre total de jeux de données par département et la population totale
departement_summary_ptot <- data %>%
filter(!is.na(region) & !is.na(ptot) & !is.na(departement)) %>%
group_by(region, departement) %>%
summarise(
total_population = sum(ptot, na.rm = TRUE),
total_datasets = sum(datsets_commune, na.rm = TRUE)
)
# Nuage de points
departement_summary_ptot <- data %>%
filter(!is.na(region) & !is.na(ptot) & !is.na(departement)) %>%
group_by(region, departement) %>%
summarise(
total_population = sum(ptot, na.rm = TRUE),
population_with_datasets = sum(ptot[datsets_commune >= 1], na.rm = TRUE),
total_datasets = sum(datsets_commune, na.rm = TRUE)
) %>%
mutate(population_coverage_ratio = population_with_datasets / total_population)
p <- ggplot(departement_summary_ptot, aes(x = total_population, y = total_datasets, text = departement, color = population_coverage_ratio)) +
geom_point(size = 2) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
scale_color_gradient(low = "lightblue", high = "darkblue", name = "Population couverte") +
labs(
title = "Population couverte et nombre de jeux de données par département",
x = "Population (en millions)",
y = "Nombre de jeux de données"
) +
theme_minimal()
interactive_plot <- ggplotly(p, tooltip = c("text", "population_coverage_ratio"))
interactive_plot
Voir le code>
# Libraries
library(dplyr)
library(readr)
# Charger les données
data <- read_csv("data/00-communes.csv")
# Création d'une table EPCI
epci_summary <- data %>%
filter(!is.na(libelle_epci)) %>%
group_by(libelle_epci) %>%
summarise(
nom_epci = first(libelle_epci),
datasets_epci = max(datasets_epci, na.rm = TRUE),
total_datasets_communes = sum(datsets_commune, na.rm = TRUE),
communes_publiant = sum(datsets_commune >= 1, na.rm = TRUE),
total_communes = n(),
part_communes_publiant = 100 * (communes_publiant / total_communes),
pop_couverte = 100 * (sum(ptot[datsets_commune >= 1], na.rm = TRUE) / sum(ptot, na.rm = TRUE)),
pop_totale_epci = sum(ptot, na.rm = TRUE),
pop_communes_publiant = sum(ptot[datsets_commune >= 1], na.rm = TRUE)
)
write_csv(epci_summary, "data/epci_summary.csv")
# Libraries
library(dplyr)
library(plotly)
# Filtre sur les 100 EPCI les plus peuplés
epci_top_100 <- epci_summary %>%
arrange(desc(pop_totale_epci)) %>%
slice_head(n = 100)
max_size <- max(sqrt(epci_top_100$total_datasets_communes))
sizeref <- 2.0 * max_size / 30
# Nuage de points
plot <- plot_ly(
epci_top_100,
x = ~pop_totale_epci,
y = ~pop_communes_publiant,
size = ~total_datasets_communes,
color = ~part_communes_publiant,
colors = colorRamp(c("lightblue", "darkblue")),
type = 'scatter',
mode = 'markers',
marker = list(
sizemode = 'diameter',
opacity = 0.7,
sizeref = sizeref,
sizemin = 2
),
text = ~paste(nom_epci, "<br>Pop totale EPCI:", pop_totale_epci,
"<br>Pop communes publiant:", pop_communes_publiant,
"<br>Part communes publiant:", round(part_communes_publiant, 2), "%")
) %>%
layout(
title = "Relation entre la population totale et la population des communes publiant par EPCI",
xaxis = list(
title = "Population totale EPCI",
type = "log",
tickvals = c(100000, 1000000),
ticktext = c("100K", "1M")
),
yaxis = list(
title = "Population des communes publiant",
type = "log",
tickvals = c(100000, 1000000),
ticktext = c("100K", "1M")
),
legend = list(x = 1, y = 0.5, bgcolor = 'rgba(255,255,255,0)', bordercolor = 'rgba(0,0,0,0)'),
margin = list(l = 50, r = 50, b = 50, t = 50),
hovermode = "closest"
)
plot